home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 118_01 / string.bds < prev    next >
Text File  |  1980-07-08  |  5KB  |  311 lines

  1. /* Sting manipulation routines for Software Tools
  2.  * source:  string.bds
  3.  * version: July 25, 1981
  4.  */
  5.  
  6.  
  7. #include tools.h
  8.  
  9.  
  10. /*  concat - concatenate two strings together */
  11.  
  12. concat (buf1, buf2, outstr)
  13. char *buf1, *buf2, *outstr;
  14. {
  15.  
  16.     int i;
  17.  
  18.     i = 0;
  19.     stcopy (buf1, 0, outstr, &i);
  20.     scopy  (buf2, 0, outstr,  i);
  21. }
  22.  
  23. /*  getwrd - get non-blank word from in [i] into out []
  24.  *           increment i.
  25.  *           return j = the number of characters copied.
  26.  *
  27.  * calling sequence:  j = getwrd (in, &i, out);
  28.  */
  29.  
  30. int getwrd (in, ii, out)
  31. char *in, *out;
  32. int  *ii;
  33. {
  34.  
  35.     int i, j;
  36.  
  37.     i = *ii;
  38.  
  39.     while (in[i] == ' ' || in[i] == TAB) {
  40.         i++;
  41.     }
  42.  
  43.     j = 0;
  44.     while ( in[i] != EOS &&
  45.             in[i] != ' ' &&
  46.             in[i] != TAB &&
  47.             in[i] != NEWLINE
  48.           ) {
  49.         out[j++] = in[i++];
  50.     }
  51.     out[j] = EOS;
  52.     *ii = i;
  53.     return(j);
  54. }
  55.  
  56. /*  sdrop --- drop chars from a string APL-style
  57.  *            if chars <  0 drop chars from end of string
  58.  *            if chars >= 0 drop chars from start of string
  59.  *            return length of new string
  60.  */
  61.  
  62. int sdrop (from, to, chars)
  63. char *from, *to;
  64. int chars;
  65. {
  66.  
  67.     int len, start;
  68.  
  69.     len = length (from);
  70.     if (chars < 0) {
  71.         return (ctoc (from, to, len + chars));
  72.     }
  73.     else {
  74.         start = min (chars, len);
  75.         return (ctoc (from + start, to, len));
  76.     }
  77.  
  78. }
  79.  
  80. /*  stake --- take chars from a string APL-style
  81.  *            if chars <  0  take chars from end
  82.  *            if chars >= 0  take chars from beginning
  83.  *            return number of chars taken
  84.  */
  85.  
  86. int stake (from, to, chars)
  87. char *from, *to;
  88. int chars;
  89. {
  90.  
  91.     int len, start;
  92.  
  93.     len = length (from);
  94.     if (chars < 0) {
  95.         start = max(len + chars, 0);
  96.         return (ctoc (from + start, to, len));
  97.         }
  98.     else {
  99.         return (ctoc (from, to, chars));
  100.     }
  101. }
  102.  
  103. /*  strcmp - compare 2 strings
  104.  *  return -1 if <, 0 if =, +1 if >
  105.  */
  106.  
  107. int strcmp (str1, str2)
  108. char *str1, *str2;
  109. {
  110.  
  111.     int i;
  112.  
  113.     for (i = 0; str1[i] == str2[i]; i++) {
  114.         if (str1[i] == EOS) {
  115.             return(0);
  116.         }
  117.     }
  118.  
  119.     if (str1[i] == EOS) {
  120.         return(-1);
  121.     }
  122.     else if (str2[i] == EOS) {
  123.         return(1);
  124.     }
  125.     else if (str1[i] < str2[i]) {
  126.         return(-1);
  127.     }
  128.     else {
  129.         return(1);
  130.     }
  131. }
  132.  
  133. /*  strim - trim trailing blanks and tabs from a string
  134.  *          return number of characters in str []
  135.  */
  136.  
  137. int strim (str)
  138. char *str;
  139. {
  140.  
  141.     int i, j;
  142.  
  143.     for (i = 0, j = 0; str[i] != EOS; i++) {
  144.         if (str[i] != BLANK && str[i] != TAB) {
  145.             j = i;
  146.         }
  147.     }
  148.     str [j + 1] = EOS;
  149.     return (j);
  150. }
  151.  
  152. /*  slstr --- slice a substring from a string
  153.  *            if first < 0  count backwards from end
  154.  *            if chars < 0  count backwards from first
  155.  *            return the number of characters in the slice
  156.  */
  157.  
  158. int slstr (from, to, first, chars)
  159. char *from, *to;
  160. int first, chars;
  161. {
  162.  
  163.     int i, k, last, len;
  164.  
  165.     len = length (from);
  166.  
  167.     if (first < 0) {
  168.         /* count backwards from end */
  169.         first += len;
  170.     }
  171.     if (chars < 0) {
  172.         /* count backwards from first */
  173.         first += chars;
  174.         chars = - chars;
  175.     }
  176.  
  177.     first = max (0, first);
  178.     last  = min (len, first + chars);
  179.  
  180.     for (k = 0, i = first; k < last; ) {
  181.         to [k++] = from[i++];
  182.     }
  183.     to [k] = EOS;
  184.     return(k);
  185. }
  186.  
  187. /*  type - determine type of char */
  188.  
  189. char type (c)
  190. int c;
  191. {
  192.     if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
  193.         return('a');
  194.     }
  195.     else if ('0' <= c && c <= '9') {
  196.         return('0');
  197.     }
  198.     else {
  199.         return(c);
  200.     }
  201. }
  202.  
  203. /*  skipbl - skip blanks and tabs at lin[i]
  204.  *           point i past blanks.
  205.  *         calling sequence:  skipbl(lin, &i);
  206.  */
  207.  
  208. skipbl(lin, i)
  209. char *lin;
  210. int *i;
  211. {
  212.     while (lin [*i] == BLANK || lin [*i] == TAB) {
  213.         (*i)++;
  214.     }
  215. }
  216.  
  217. /*  equal - compare str1 to str2 */
  218.  
  219. BOOL equal (str1, str2)
  220. char *str1, *str2;
  221. {
  222.  
  223.     int i;
  224.  
  225.     for (i = 0; str1 [i] == str2 [i]; i++) {
  226.         if (str1 [i] == EOS) {
  227.             return (YES);
  228.         }
  229.     }
  230.     return (NO);
  231. }
  232.  
  233. /*  locate --- look for c in char class at pat (offset) */
  234.  
  235. BOOL locate (c, pat, offset)
  236. char c, *pat;
  237. int offset;
  238. {
  239.  
  240.     int i;
  241.  
  242.     /*  size of class is at pat [offset], chars follow */
  243.  
  244.     for (i = offset + pat [offset]; i > offset; i--) {
  245.         if (c == pat [i]) {
  246.             return (YES);
  247.         }
  248.     }
  249.     return (NO);
  250. }
  251.  
  252. /*  scopy - copy string at from (i) to to (j) */
  253.  
  254. scopy (from, i, to, j)
  255. char *from, *to;
  256. int i, j;
  257. {
  258.     while ((to [j++] = from [i++]) != EOS) {
  259.         ;
  260.     }
  261. }
  262.  
  263. /* stcopy - copy string at from [i] to to [j]
  264.  *          update j to point AT the EOS
  265.  *
  266.  * calling sequence: stcopy (from, i, to, &j);
  267.  */
  268.  
  269. stcopy (from, i, to, j)
  270. char *from, *to;
  271. int i;
  272. int *j;
  273. {
  274.     while ((to [*j] = from [i++]) != EOS) {
  275.         (*j)++;
  276.     }
  277. }
  278.  
  279. /*  index - find char  c  in string  str */
  280.  
  281. int index (str, c)
  282. char *str, c;
  283. {
  284.  
  285.     int i;
  286.  
  287.     for (i = 0; str [i] != EOS; i++) {
  288.         if (str [i] == c) {
  289.             return(i);
  290.         }
  291.     }
  292.     return (-1);
  293. }
  294.  
  295. /*  length - compute length of string
  296.  *           do not count EOS in length
  297.  */
  298.  
  299. int length (str)
  300. char *str;
  301. {
  302.     int i;
  303.  
  304.     for (i = 0; str [i] != EOS; i++) {
  305.         ;
  306.     }
  307.     return(i);
  308. }
  309.  
  310.  
  311.